# -*- coding: utf-8 -*-
u"""
Modulo utilizado no primeiro projecto da Disciplina de Linguagem de Programação
que consiste em elaboração de uma aplicação capaz de fazer leituras dos dados
num ficheiro excel(.xls) e a sua respectiva escrita dnum ficheiro de base de
dados no formato sqlite.
Utilizará os dados da base de daos para gerar quer lista deresultados
quer gráficos estatísticos representativos
de:
- Total de Colocados por Escola
- Total de Colocados por Distrito
- Total de Vagas Sobrantes por Escola
- Total de Vagas Sobrantes por Distrito
- Percentagem de Colocados por Escola
- Permilagem de Colocados por Distrito
"""
import wx, os
import string
from src import lp1314_4708 as lp
from src import opo_db as DB

##############################################
#variables
xls_file = ''                                                               #nome/endereco do ficheiro excel
db_file = ''                                                                #enome/endereco do ficheiro db
csv_file = ''                                                               #endereco onde guardar os ficheiros csv
data_dict = {"Total de Colocados por Escola":[],                            #guarda os resultados das consultas pedidas
    "Total de Colocados por Distrito":[], 
    "Total de Vagas Sobrantes por Escola":[], 
    "Total de Vagas Sobrantes por Distrito":[], 
    "Percentagem de Colocados por Escola":[], 
    "Permilagem de Colocados por Distrito":[]
    }
extraq_res = []                                                             #gurada resultado das consultas extras
#end variables

#ao carregar no botão Gerar BD, recebe ficheiro excel e ficheiro para BD
def onCall_db_creation(xls_f, db_f):
    """
    takes an existing excel file and a path/name for 
    a database file and call the respective function to 
    create the db and load the data
    xls_f   - path/name to an existing excel file
    db_f    - path/name where to save the db file
    """
    try:
        res = lp.openRead_book(xls_f, db_f)
    except:
        raise
    else:
        res = u"Concluida\n{0} criada\nTempo {1:.2} segs".format(*res)
        wx.MessageBox(res, u"Confirmação",  wx.OK| wx.ICON_INFORMATION)
pass

#cria um nome para ficheiro csv e guarda os dados da lista para o disco
def onCall_csv_save(csv_dir):
    lst_key = string.replace(csv_file,' ', '_')
    lst_key = lst_key + '.csv'
    csv_dir = os.path.join(csv_dir, lst_key)
    d_lst = data_dict[csv_file][1]
    try:
        lp.writeTo_csvFile(csv_dir, d_lst)
    except:
        wx.MessageBox("ERRO ao Salvar os Dados", "AVISO",  wx.OK| wx.ICON_EXCLAMATION)
    else: wx.MessageBox("Concluida\nDados Guardado em %s" %(csv_dir), 
    u"Confirmação",  wx.OK| wx.ICON_INFORMATION)
pass

#connect to the database
def onCall_db_conn():
    """
    returns the string to be used as 
    key options to query the database
    """
    wx.MessageBox(u"Ligação Estabelecida\nEscolhe as Opções de Consultas em baixo",
    u"Confirmação",  wx.OK| wx.ICON_INFORMATION)
    lst = data_dict.keys()
    lst.sort(key=len, reverse=False)
    return lst
pass

#on call to get data to fill the list
def onCall_get_list(value, db):
    """
    takes a string 'value' to use as a key to 
    save the resulting data list from 'db'
    value   - string item seleted on the interface to query db
    db      - the database to get data list from
    """
    lst = data_dict.keys()
    if ((value in lst) and (db != '')):
        try:
            lst.sort(key=len, reverse=False)
            pos = lst.index(value)
            if pos == 0:
                data_dict[value] = ('03', lp.getPlaced_PerSchool(db))
            elif pos == 1:
                data_dict[value] = ('04', lp.getPlaced_PerState(db))
            elif pos == 2:
                data_dict[value] = ('05', lp.getPerc_Placed(db))
            elif pos == 3:
                data_dict[value] = ('01', lp.getFPlaces_PerSchool(db))
            elif pos == 4:
                data_dict[value] = ('06', lp.getPermil_Placed(db))
            elif pos == 5:
                data_dict[value] = ('02', lp.getFPlaces_PerState(db))
        except:
            wx.MessageBox(u"""
            ERRO INTERNO!
            Verifique se %s
            é o ficheiro correcto""" % (db), u"AVISO",  wx.OK| wx.ICON_ERROR)
        else:
            total_vals = data_dict[value][1][1]
            total_vals = sum(map(lambda t: t[-1], total_vals))                  #calcular a soma dos valores da ultima coluna
            return (data_dict[value][1], total_vals)
    pass
pass

#ao escolher opcao mais consultas do menu ferramentas
def onCall_moreStats():
    """process data from the database or from an existing
    list to show in a new dialog so user has more options 
    to query the database
    """
    scl_clst=[]
    course_clst=[]
    global extraq_res
    if db_file != '':
        if len(extraq_res) > 0:
            for xy in extraq_res:
                scl_clst.append(xy[0]+'-'+ xy[1])
                course_clst.append(xy[2]+'-'+xy[3])
        else:
            res = lp.get_all_places(db_file)
            extraq_res = res[1]            
            for xy in res[1]:
                scl_clst.append(xy[0]+'-'+ xy[1])
                course_clst.append(xy[2]+'-'+xy[3])
        scl_clst = list(set(scl_clst))
        course_clst = list(set(course_clst))
    else: wx.MessageBox(u"Indique um Ficheiro BD Válido\n e/ou Faça a Ligação a BD",
                                "AVISO",  wx.OK| wx.ICON_EXCLAMATION)
    return (scl_clst, course_clst)
pass

#ao guradar a lista de resultado no dicionario
def store_data(key_value, data_value):
    """store the given pair key-value in dict data structure
    """
    global csv_file
    data_dict[key_value] = data_value
    csv_file = key_value                            #guradar a chave para futura consulta
pass

#filtra os dados pedidos pela consulta extra
def onCall_msData(options):
    """process the user options during extra querying
    to create and return a new list of data
    options - user options choosen from the new dialog
    """
    code = options[1].split('-')[0]                             #codigo escola/curso para filtragem dos dados
    extra_lst = []
    pos=4
    x_cols = options[2:]
    if options[0] == "Por Escolas":
        if len(x_cols) == 1:
            c1=x_cols[0][0]
            extra_lst = map(lambda x: (x[2],x[3], x[c1+pos]), filter(lambda c: c[0]==code, extraq_res))
        elif len(x_cols) == 2:
            c1=x_cols[0][0]
            c2=x_cols[1][0]
            extra_lst = map(lambda x: (x[2], x[3], x[c1+pos], x[c2+pos]), filter(lambda c: c[0]==code, extraq_res))
        elif len(x_cols) == 3:
            c1=x_cols[0][0]
            c2=x_cols[1][0]
            c3=x_cols[2][0]
            extra_lst = map(lambda x: (x[2], x[3], x[c1+pos], x[c2+pos], x[c3+pos]), filter(lambda c: c[0]==code, extraq_res))
    elif options[0] == "Por Cursos":
        if len(x_cols) == 1:
            c1=x_cols[0][0]
            extra_lst = map(lambda x: (x[0], x[1], x[c1+pos]), filter(lambda c: c[2]==code, extraq_res))
        elif len(x_cols) == 2:
            c1=x_cols[0][0]
            c2=x_cols[1][0]
            extra_lst = map(lambda x: (x[0], x[1], x[c1+pos], x[c2+pos]), filter(lambda c: c[2]==code, extraq_res))
        elif len(x_cols) == 3:
            c1=x_cols[0][0]
            c2=x_cols[1][0]
            c3=x_cols[2][0]
            extra_lst = map(lambda x: (x[0], x[1], x[c1+pos], x[c2+pos], x[c3+pos]), filter(lambda c: c[2]==code, extraq_res))
    return extra_lst
pass

#ao escolher opcao do menu ferramentas Gerar Graficos
def onCall_genGraphics():
    """process data from dict data structure if any
    and from the database to generate respective graphics
    svname  - a name for generated graphic
    """
    grh_lst = filter(lambda v: len(v)>0, data_dict.values())                  #filtrar as listas q nao estao vazias
    if ((db_file !='') and (len(grh_lst) > 0)):       
        total_school = DB.get_tfp_PerSchool(db_file)                  #armazena a pesquisa de vagas iniciais por escola 
        total_state = DB.get_tfp_PerState(db_file)                    #e por distrito, serve como grfico de fundo
        for (p,val) in grh_lst:
            lp.gen_graphics(p, val, total_school, total_state)
        pass
    else: wx.MessageBox(u"Sem Dados!",
                                "AVISO",  wx.OK| wx.ICON_EXCLAMATION)
pass
